package com.junyidao.game.controller;

import com.junyidao.game.pay.WechatPayAccount;
import com.junyidao.game.service.AccountChargeService;
import com.junyidao.game.service.WechatPayService;
import com.junyidao.game.util.XMLUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * 接收微信支付异步通知回调地址
 * 微信支付交互细节：
 * 以下是支付场景的交互细节，请认真阅读，设计商户页面的逻辑：
 * （1）用户打开商户网页选购商品，发起支付，在网页通过JavaScript调用getBrandWCPayRequest接口，发起微信支付请求，用户进入支付流程。
 * （2）用户成功支付点击完成按钮后，商户的前端会收到JavaScript的返回值。商户可直接跳转到支付成功的静态页面进行展示。
 * （3）商户后台收到来自微信开放平台的支付成功回调通知，标志该笔订单支付成功。
 * 注：（2）和（3）的触发不保证遵循严格的时序。JS API返回值作为触发商户网页跳转的标志，但商户后台应该只在收到微信后台的支付成功回调通知后，才做真正的支付成功的处理。
 * Created by Administrator on 2016/1/13.
 */

@Controller
@RequestMapping(value = "/payNotify")
public class PayNotifyController extends BaseController {

    private static final Logger logger = LoggerFactory.getLogger(PayNotifyController.class);

    @Autowired
    private WechatPayService wechatPayService;

    @Autowired
    private AccountChargeService accountChargeService;

    @ResponseBody
    @RequestMapping("/wechatPay/{id}")
    public String payNotify(HttpServletRequest request, @PathVariable Integer id) throws Exception {
        logger.info("微信支付结果通知:订单号" + id);
        Map<String, Object> ret = new HashMap<>();
        Map<String, String> map = XMLUtil.parseXml(request);
        if (map == null) {
            ret.put("return_code", "FAIL");
            ret.put("return_msg", "系统错误");
            logger.info("错误原因:解析XML失败");
            return XMLUtil.getXmlString(ret);
        }
        String return_code = map.get("return_code");
        if (return_code.equals("FAIL")) {
            ret.put("return_code", "SUCCESS");
            ret.put("return_msg", "");
            logger.info("错误原因:" + map.get("return_msg"));
            return XMLUtil.getXmlString(ret);
        }
        String result_code = map.get("result_code");
        if (result_code.equals("FAIL")) {
            ret.put("return_code", "SUCCESS");
            ret.put("return_msg", "");
            logger.info("错误原因:" + map.get("err_code_des"));
            return XMLUtil.getXmlString(ret);
        }
        String sign = map.get("sign");
        String sign2 = wechatPayService.wechatSignature(map, WechatPayAccount.MCH_KEY);
        if (!sign.equals(sign2)) {
            ret.put("return_code", "FAIL");
            ret.put("return_msg", "签名错误");
            logger.info("错误原因:接受通知签名错误");
            return XMLUtil.getXmlString(ret);
        }
//        accountChargeService.updateWechatPayOrder(map,id);
        ret.put("return_code", "SUCCESS");
        ret.put("return_msg", "");
        return XMLUtil.getXmlString(ret);
    }


}
